﻿/** @description 编辑器的默认验证器
 *  @type 
 */
Ccay.UI.Config.Editor = {
	rules : {
		number : {
			number : true
		},
		floatRequ : {
			number:true
		},
		integer : {
			digits : true
		},
		currency : {
			number : true
		},
		date : {
			date : true
		},
		datetime : {
			dateISO : true
		},
		dateym : {
			dateym : true
		},
		dateHM : {
			datetime : true
		},
		rate : {
			number : true,
			max : 1,
			min : 0
		}
	}
}

Ccay._Editor = {
	/** @description 初始化编辑器
	 *  @param {Object} container 编辑器的容器对象
	 *  @param {Object} op 列columns的editorOp属性参数
	 *  @return {}
	 */
	render : function(container, op, value) {
		var ctr = this.build(container, op);
		this.setAttr(ctr, op);
		this.setValid(op);
		value && this.setValue(ctr, value);
		return ctr;
	},
	/** @description 创建编辑器
	 *  @param {Object} container 编辑器的容器对象
	 *  @param {Object} op 列columns的editorOp属性参数
	 *  @return {}
	 */
	build : function(container, op) {
		return $.create("input", null, op && op.id, "text").appendTo(container);
	},
	/** @description 设置编辑器的属性
	 *  @param {Object} ctr 该编辑器对象
	 *  @param {Object} op 列columns的editorOp属性参数
	 */
	setAttr : function(ctr, op) {
		if (ctr && op) {
			//op.id && ctr.id(op.id);
			op.cssName && ctr.addClass(op.cssName);
			op.field && ctr.attr('name', op.field);
			op.style && ctr.attr('style', op.style);
			// 扩展属性
			if (op.prop) {
				$.each(op.prop, function(key, value) {
							ctr.attr(key, value);
						});
			}
			//            if (op.value) {
			//                ctr.attr('initValue', op.value);
			//                this.setValue(ctr, op.value);
			//            }
		}
	},
	/** @description 获取编辑器的值
	 *  @param {Object} ctr 该编辑器对象
	 *  @return {}
	 */
	getValue : function(ctr) {
		return ctr.manager().getValue();
	},
	/** @description 设置编辑器的值
	 *  @param {Object} ctr 该编辑器对象
	 *  @param {String} value 编辑之前，单元格的值
	 */
	setValue : function(ctr, value) {
		ctr.manager ? ctr.manager().setValue(value) : ctr.val(value);
	},
	/** @description 设置编辑器的验证
	 *  @param {Object} ctr 该编辑器对象
	 *  @param {Object} op 列columns的editorOp属性参数
	 */
	setValid : function(op) {
		if (op.valid !== false && op.type) {
			var defRule = Ccay.UI.Config.Editor.rules[op.type];
			if (defRule)
				op.rule = $.extend(true, {}, defRule, op.rule);
		}
	},
	/** @description 验证编辑器
	 *  @param {Object} ctr 该编辑器对象
	 *  @return {}
	 */
	valid : function(ctr) {
		if (!ctr.valid()) {
			return !ctr.hasClass('error');
		}
		return true;
	}

	//    ,update:function(valueText,rowData,cell)
}

Ccay.Editor = $.IAdapter(Ccay._Editor, {
			/** @description 通过编辑器名称进行初始化
			 *  @param {String} type 编辑器名称
			 *  @param {Object} container 编辑器的容器对象
			 *  @param {Object} op 列columns的editorOp属性参数
			 *  @return {}
			 */
			build : function(type, container, op) {
				this.get(type).render(container, op);
				return this;
			}
		}, true);

/** -------------------------------------编辑器注册------------------------------------ */
(function(Editor) {
	/** bool：复选框（布尔）编辑器注册
	 */
	Editor.add('bool,checkbox', {
				build : function(container, op) {
					var ctr =  $.create("input", "ccay-editor-checkbox", op && op.id, "checkbox").appendTo(container);
					op.shortChecked && ctr.attr("shortChecked",true);
					return ctr;
				},
				getValue : function(ctr) {
					return ctr.attr('checked') ? true : false;
				},
				setValue : function(ctr, value) {
					ctr.attr("shortChecked")?(value ?ctr.removeAttr("checked") : ctr.attr('checked', "checked")):(value ?ctr.attr('checked', "checked"):ctr.removeAttr("checked"));
				},
				valid : function(ctr) {
					return true;
				}
			});
	
	/** ccayInputHistory：历史输入联想框编辑器注册
	 *  
	 */
	
	Editor.add('listoryInput', {
		build : function(container, op) {
			var ctr = $.create('input', "ccay-listory",'', "text").appendTo(container);
			
			ctr.ccayInputHistory();
			// 临时方案，待重构：解决滚动下拉面板时，编辑器失去焦点关闭的问题
			initDropdownEvent(ctr);
			return ctr;
		},
		getValue : function(ctr) {
			return {
				value : ctr.manager().getValue() || "",
				data : ctr.data("data"),
				text : ctr.val() || ""
			};
		},
		setValue : function(ctr, valueObj) {
			valueObj = Ccay.Format.toValueObj(valueObj);
			ctr.manager().setValue(valueObj.value, valueObj.text);
		}
	});

	/** textarea：文本域编辑器注册
	 *  op.width {String} 设置该文本域编辑器的宽度
	 *  op.height {String} 设置该文本域编辑器的高度，默认50px
	 */
	Editor.add('longtext,textarea', {
				build : function(container, op) {
					var ctr = $.create("textarea", "ccay-editor-textarea", op && op.id).appendTo(container);
					op.width && ctr.css("width", op.width)
					return ctr.css("height", op.height || "50px");
				}
			});

	/** rate：比率编辑器注册
	 */
	Editor.add('rate', {
				setValid : function(op) {
					this.callParent("setValid", [op]);
					if(op.format && op.format.limitMax === false){
		                   var field = arguments.callee.caller.arguments.callee.caller.arguments[1];
		                   delete op.rule.max;
		                   field && field.rule && (delete field.rule.max);
		                }else if (op.format && op.format.total) {
						op.rule.max = op.format.total;
					}
				}
			});

	/** select 下拉框  编辑器注册
	 *  配置参数说明 op.service 数据集合  op.valueField 实际值字段  op.displayField  显示字段
	 */
	/*Editor.add('select', {
	    init: function (container, op) 
	    {
			var ctr = $.create("SELECT", "ccay-editor-select").appendTo(container);
	        this.setAttr(ctr, op);
	        if(op.format.service)
	        {
	        	var datas = Ccay.DataHelper.getObj(op.format.service);
		        if($.isPlainObject(datas))
		        {
		        	$.each(datas, function(value, text)
		        	{
	        			ctr.append("<option value='{0}'>{1}</option>".format(value, text));
	        		});
		        }
		        else
		        {
			        for(var i=0; i<datas.length; i++)
			        {
			        	ctr.append("<option value='{0}'>{1}</option>".format(datas[i][op.format.valueField], datas[i][op.format.displayField]));
			        }
		        }
	        }
	        return ctr;
	    },
	    getValue: function (ctr) 
	    {
	    	var valueObj = {
	    		value: ctr.ccayGetValue() || "",
	    		text: ctr.find("option:selected").text() || ""
	    	};
	    	return valueObj;
	    },
	    setValue: function (ctr, valueObj) 
	    {
	        ctr.ccaySetValue(valueObj.value);
	    }
	});*/

	/** datetime/date/dateym/datehm：日期时间带秒/日期/年月/日期时间不带秒编辑器注册
	 *  op.wmindate {String} 设置编辑模式日期可选范围的最小值
	 *  op.wmaxdate {String} 设置编辑模式日期可选范围的最大值
	 */
	Editor.add('datetime,date,dateym,datehm', {
				build : function(container, op) {
					var ctr = $.create("input", "ccay-calendar", op && op.id || $.newGuid("grid_editor_"), "text").appendTo(container);
					ctr.attr("format", (op.format && (op.format.renderFormat || op.format.dataFormat || op.type)) || op.type);
					op.wmindate && ctr.attr("wmindate", op.wmindate);
					op.wmaxdate && ctr.attr("wmaxdate", op.wmaxdate);
					op.dblmonth && ctr.attr("dblmonth", op.dblmonth);
					// 年月无日
					op.type == "dateym" && ctr.attr("showDate", false);
					// 带时分无秒数
					op.type == "datehm" && (op.showSecond = false);
					// 比较验证
					op.compareto && ctr.addClass("dateCompare").attr("compareto", op.compareto);
					
					ctr.ccayDatepicker(op);
					return ctr;
				},
				getValue : function(ctr) {
					var format = ctr.attr("format") || null;
					format = format && Ccay.Config.Format[format] ? null : format;
					return Ccay.Format.toDate(ctr.val(),format);
				},
				setValue : function(ctr, value) {
					var fmtStr = ctr.attr("format");
					ctr.val(Ccay.Format.toDateStr(value, Ccay.Config.Format[fmtStr] || fmtStr));
				}
			});

	/** filesize：文件大小输入文本框
	 *  op.unit {String} 单位，默认为K，按照K的数值保存到数据库
	 *  op.max {number} 最大值
	 *  op.min {number} 最小值
	 */
	Editor.add('filesize', {
				build : function(container, op) {
					var ctr = $.create("input", "filesize", op && op.id || $.newGuid("grid_editor_"), "text").appendTo(container);
					ctr.attr("unit", op.unit || "KB");
					return ctr;
				},
				getValue : function(ctr) {
					var value = ctr.val(), unit = ctr.attr("unit"), currUnit = value[value.search(/[BKMGT]/i)] || unit;
					if (value == "")
						return "";
					return parseFloat(Ccay.Format.toFileSize(parseFloat(value), unit, currUnit.toUpperCase()) || 0);
				},
				setValue : function(ctr, value) {
					if (value && ( typeof value == "number" || value.search(/[BKMGT]/i) != -1)) { 
						ctr.val(value);
					} else { 
						var unit = ctr.attr("unit") || "K";
						ctr.val(Ccay.Format.toFileSize(value, null, ctr.attr("unit")) || (value ? "0" + unit : ""));
					}
				}
			});

	// 临时方案，待重构：解决下拉框的鼠标滚动下拉面板时，编辑器失去焦点关闭的问题
	function initDropdownEvent(ctr) {
		var popuper = $("#" + ctr.id() + "_ddl");
		// 编辑器滚动时，光标移入输入框
		popuper.on("mouseover",function () {
			ctr.data("ctr_locked", true);
		}).on("mouseout",function () {
			ctr.data("ctr_locked", false);
			ctr.focus();
		})
	}
			
	/** combobox/enum：下拉框编辑器注册
	 *  op.conf {Object} 设置编辑模式下拉框的属性配置
	 */
	Editor.add('combobox,enum,lookup', {
				build : function(container, op) {
					var ctr = $.create("input", "ccay-combobox", op && op.id, "text").appendTo(container), format = op.format,
						bean = op.conf || {};
					// 赋值valueField的默认值
					if (!bean.valueField && format.valueField) {
						bean.valueField = format.valueField;
					}
					// 赋值displayField的默认值
					if (!bean.displayField && format.displayField) {
						bean.displayField = format.displayField;
					}
					if (format.service) {
						ctr.attr("service", format.service);
						ctr.ccayCombobox(bean);
					} else {
						if ($.isArray(format.data)) {
							//将数据由数组格式转换成对象格式
							format.data = Ccay.Format.convertSimpleArrayToObject(format.data, bean.valueField, bean.displayField);
						}
						ctr.dropdown(bean, format.data);
					}
					// 临时方案，待重构：解决滚动下拉面板时，编辑器失去焦点关闭的问题
					initDropdownEvent(ctr);
					return ctr;
				},
				getValue : function(ctr, objValue) {
					var value = ctr.manager().getValue();
					//是否返回obj对象数据
					if (objValue) {
						return value != null ? {
							value : value,
							text : ctr.val()
						} : null;
					}
					return value;
				},
				setValue : function(ctr, valueObj) {
					valueObj = Ccay.Format.toValueObj(valueObj);
					
					ctr.manager().setValue(valueObj.value, valueObj.text);
				}
			});

	/** suggest：联想框编辑器注册
	 *  op.conf {Object} 设置编辑模式联想框的属性配置
	 */
	Editor.add('suggest', {
				build : function(container, op) {
					var ctr = $.create("input", "ccay-suggest", op && op.id, "text").appendTo(container),
					//设置ccaySuggest控件需要用到的属性，并调用接口初始化
					bean = op.conf || {}, fnSelected = bean.fnSelected;
					bean.fnSelected = function(value, text, oldValue, item, selector, data) {
						ctr.data("data", data);
						fnSelected && fnSelected.call(this, value, text, oldValue, item, selector, data);
					}
					ctr.ccaySuggest(bean);
					// 临时方案，待重构：解决滚动下拉面板时，编辑器失去焦点关闭的问题
					initDropdownEvent(ctr);
					return ctr;
				},
				getValue : function(ctr) {
					return {
						value : ctr.manager().getValue() || "",
						data : ctr.data("data"),
						text : ctr.val() || ""
					}
				},
				setValue : function(ctr, valueObj) {
					valueObj = Ccay.Format.toValueObj(valueObj);
					ctr.manager().setValue(valueObj.value, valueObj.text);
				}
			});
		
	/** popbox：联想框弹出框编辑器注册
	 *  op.conf {Object} 设置编辑模式联想弹出框的属性配置
	 */
	Editor.add('popbox', {
		build : function(container, op) {
			var ctr = $.create("input", "", op && op.id, "text").appendTo(container),
			bean = op.conf || {}, fnCallback = bean.callback;
			bean.callback = function(value, text, oldValueOrData, item, selector, data) {
				var currData = $.type(data) == "object" ? data : oldValueOrData;
				
				if($.type(oldValueOrData) == "array" ){
					currData = oldValueOrData[oldValueOrData.length - 1];
				}
				ctr.data("data", currData);
				fnCallback && fnCallback.call(this, value, text, oldValueOrData, item, selector, data);
				ctr.focus();
			}
			ctr.ccayPopBox(bean);
			ctr.addClass("igrid-popbox");
			// 临时方案，待重构：解决滚动下拉面板时，编辑器失去焦点关闭的问题
			initDropdownEvent(ctr);
			return ctr;
		},
		getValue : function(ctr) {
			return {
				value : ctr.manager().getValue() || "",
				data : ctr.data("data"),
				text : ctr.val() || ""
			}
		},
		setValue : function(ctr, valueObj) {
			valueObj = Ccay.Format.toValueObj(valueObj);
			ctr.manager().setValue(valueObj.value, valueObj.text);
		}
	});
	/** dept：部门选择编辑器注册
	 * 
	 */
	Editor.add('hrdept', {
				build : function(container, op) {
					var ctr = $.create("input", null, op && op.id || $.newGuid("ctr_editor_"), "text").appendTo(container), btn = $.create("input", "jbutton", null, "button").attr("value", "...").appendTo(container), bean = op.conf || {};
					op.readonly && ctr.attr("readonly", "readonly");
					btn.click(function() {
						bean.initDept = ctr.data("value");
						ctr.data("ctr_locked", true);
						Ccay.UI.fireCtrHandler(ctr, "fnLocked", true);
						bean.callback = function(value, text) {
							ctr.data("value", value).val(text);
						};
						bean.fnBeforeClose = function() {
							ctr.data("ctr_locked", false).focus();
							Ccay.UI.fireCtrHandler(ctr, "fnLocked", false);
							return true;
						};
						Ccay.Component.selectHRDept(bean);
					});
					return ctr;
				},
				getValue : function(ctr) {
					return {
						value : ctr.manager().getValue() || "",
						text : ctr.val() || ""
					}
				},
				setValue : function(ctr, valueObj) {
					ctr.data("value", valueObj.value);
					this.callParent("setValue", [ctr, valueObj.text]);
				}
			});

	/** hrapprover：HR权签人选择编辑器注册
	 * 
	 */
	Editor.add('hrapprover', {
				build : function(container, op) {
					//var ctr = $.create("input", null, op && op.id || $.newGuid("ctr_editor_"), "text").appendTo(container), btn = $.create("input", "jbutton", null, "button").attr("value", "...").appendTo(container), bean = op.conf || {};
					var ctr = $.create("input","hrapprover-input", op && op.id || $.newGuid("ctr_editor_"), "text").appendTo(container), 
					btn = $.create("input","hrapprover-trigger jbutton", "", "button").attr("value", "...").appendTo(container), bean = op.conf || {};
					var editord = this, ctrClear = $.create("input", "hrapprover-clear", "", "button").val("×").appendTo(container).click(function(){
						editord.setValue(ctr,{value :"",text:""});
					});
					op.readonly && ctr.attr("readonly", "readonly");
					btn.click(function() {
						bean.initApprover = ctr.data("value");
						ctr.data("ctr_locked", true);
						Ccay.UI.fireCtrHandler(ctr, "fnLocked", true);
						bean.callback = function(value, text) {
							ctr.data("value", value).val(text);
						};
						bean.fnBeforeClose = function() {
							ctr.data("ctr_locked", false).focus();
							Ccay.UI.fireCtrHandler(ctr, "fnLocked", false);
							return true;
						};
						Ccay.Component.selectHRApprover(bean);
					});
					return ctr;
				},
				getValue : function(ctr) {
					return {
						value : ctr.manager().getValue() || "",
						text : ctr.val() || ""
					}
				},
				setValue : function(ctr, valueObj) {
					valueObj = Ccay.Format.toValueObj(valueObj);
					ctr.data("value", valueObj.value);
					this.callParent("setValue", [ctr, valueObj.text]);
				}
			});

	/** ldap：用户联想框编辑器注册
	 *  op.valueField {String} 值属性，默认为userId。可选参数有：userAccount、userId
	 *  op.multi {Boolean} 设置编辑模式人员联想框是否可进行多选，默认为false
	 *  op.conf {Object} 设置编辑模式人员联想框的属性配置
	 */
	Editor.add('ldap', {
				build : function(container, op) {
					var showType = (op.conf && op.conf.showType) == "textarea" ? "textarea" : "input";
					var ctr = $.create(showType, "ccay-user", op && op.id, "text").appendTo(container);
					//var ctr = $.create("input", "ccay-user", op && op.id, "text").appendTo(container);
					ctr.attr("valueField", op.format.valueField);
					//设置combobox控件需要用到的属性，并调用接口初始化
					
					ctr.ccayLdap(op.conf);
					// 临时方案，待重构：解决滚动下拉面板时，编辑器失去焦点关闭的问题
					initDropdownEvent(ctr);
					return ctr;
				},
				getValue : function(ctr) {
					return {
						value : ctr.manager().getValue() || (ctr.attr("valueField") == "userId" ? 0 : ""),
						text : ctr.val() || ""
					};
				},
				setValue : function(ctr, valueObj) {
					valueObj = Ccay.Format.toValueObj(valueObj);
					ctr.manager().setValue(valueObj.value, valueObj.text);
				}
			});

	// 初始化弹出框的参数设置
	function initPopupConfig(ctr, bean) {
		ctr.data("ctr_locked", true);
		Ccay.UI.fireCtrHandler(ctr, "fnLocked", true);
		bean.splitChar = bean.splitChar || Ccay.Config.Format.valueSplit;
		var callback = bean.callback , flag;
		bean.callback = function(data) {
			var value = [], display = [];
			if (bean.multiSelect) {
				for (var i = 0, d; d = data[i]; i++) {
					value.push(d[bean.uniqueKey]);
					display.push(d[bean.displayField]);
				}
				value = value.join(bean.splitChar);
				display = display.join(bean.splitChar);
			} else {
				value = data[bean.uniqueKey];
				display = data[bean.displayField];
			}
			callback && (flag = callback(data));
			if(flag !== false){
				ctr.data("data", data).data("value", value).val(display);
			}
			return flag;
		};
		bean.beforeClose = function() {
			ctr.data("ctr_locked", false).focus();
			Ccay.UI.fireCtrHandler(ctr, "fnLocked", false);
			bean.fnSelect && bean.fnSelect();
			return true;
		};
		if (bean.multiSelect) {
			bean.selectedItems = ctr.data("value").split(bean.splitChar);
		} else {
			bean.selectedItems = ctr.data("value");
		}
	};

	/** popup：公共选择弹出框编辑器注册
	 *  op.uniqueKey {String} 值属性
	 *  op.conf {Object} 设置编辑模式通用弹出框的属性配置
	 */
	Editor.add('popup', {
				build : function(container, op) {
					var ctr = $.create("input", "popup-input", op && op.id || $.newGuid("ctr_editor_"), "text").appendTo(container), btn = $.create("input", "popup-trigger jbutton", "", "button").attr("value", "...").appendTo(container), bean = op.conf || {},grid=container.parents(".ccay-igrid:first").manager();
					var editor = this, ctrClear = $.create("input", "popup-clear", "", "button").val("×").appendTo(container).click(function(){
						editor.setValue(ctr,{value :"",text:""});
					});
					op.readonly && ctr.attr("readonly", "readonly");
					btn.click(function() {
								ctr.focus();
								//initPopupConfig(ctr, bean);
								//Ccay.Component.popup(bean, bean.title, bean.multiSelect, bean.width, bean.height);
								//允许igrid中popup传递当前行的数据作为参数。
								var nbean = $.extend({},bean);
								var rowData = grid.getRowData(grid.getCellRow(ctr.data("caller")));
								nbean.servicePath && (nbean.servicePath = nbean.servicePath.formatField(rowData));
								initPopupConfig(ctr, nbean);
								Ccay.Component.popup(nbean, nbean.title, nbean.multiSelect, nbean.width, nbean.height);
							});
					return ctr;
				},
				getValue : function(ctr) {
					return {
						value : ctr.manager().getValue() || "",
						data : ctr.data("data"),
						text : ctr.val() || ""
					}
				},
				setValue : function(ctr, valueObj) {
					valueObj = Ccay.Format.toValueObj(valueObj);
					ctr.data("value", valueObj.value);
					this.callParent("setValue", [ctr, valueObj.text]);
				}
			});

	
	/** hidden：隐藏域编辑器注册
	 */
	Editor.add('hidden', {
				build : function(container, op) {
					return $.create("input", null, op && op.id, "hidden").appendTo(container);
				}
			});

	/**
	 * currency
	 */
	Editor.add('currency', {
				build : function(container, op) {
					var ctr = $.create("input", null, op && op.id, "text").appendTo(container);
					if(op.format && op.format.fraction){
						ctr.attr("fraction",op.format.fraction);
					}
					return ctr;
				},
				getValue : function(ctr) {
					return Ccay.Format.toCurrency(ctr.val(),ctr.attr("fraction") || Ccay.Config.Format.decimalfraction);
				},
				setValue : function(ctr, value) {
					//修复Currency设置值时也是千分位形式
					//value = Ccay.Format.toCurrency(value,ctr.attr("fraction") || Ccay.Config.Format.decimalfraction)
					ctr.manager().setValue(value, value);
				}
			});
	/**
	 * currencystr
	 */
	Editor.add('currencystr', {
				build : function(container, op) {
					var ctr = $.create("input", null, op && op.id, "text").appendTo(container);
					if(op.format && op.format.fraction){
						ctr.attr("fraction",op.format.fraction);
					}
					return ctr;
				},
				getValue : function(ctr) {
					return Ccay.Format.toCurrencyStr(ctr.val(),ctr.attr("fraction") || Ccay.Config.Format.decimalfraction);
				},
				setValue : function(ctr, value) {
					//修复Currency设置值时也是千分位形式
					//value = Ccay.Format.toCurrency(value,ctr.attr("fraction") || Ccay.Config.Format.decimalfraction)
					ctr.manager().setValue(value, value);
				}
			});
	
	var arrayEditor = {
		// 设置工具栏的设置
		setToolOp: function (defaultData) {
			var toolOp = {
	    		hasItemDiv: false,
				items: [{type: "img", icon: "add", text: "ccay.common.button.add",
					click: function (btn, toolBar) {
						var gridMag = toolBar.dom.next().manager(),
							tempData = $.extend(true, {}, defaultData);
						// 验证grid的编辑器
						if (gridMag.valid()) {
							// 新增数据
							gridMag.op.Storage.insertItem(tempData);
							// 重新加载
							gridMag.reload();
							var columns = gridMag.op.columns, editCol;
							// 循环判断编辑列
							$.each(columns, function (i, col) {
								if (!col.inner && col.editable !== false) {
									editCol = col;
									return false;
								}
							});
							// 请求编辑器
							gridMag.callEditor(gridMag.getRowCell(tempData._index, editCol._i));
						}
					}
				}]
			};
			return toolOp;
		},
		// 合并自定义的参数
		setGridOp: function (gridOp) {
			// 合并参数设置
			var gridDefaultOp = $.extend(true, {
					editMode: true,
					allowSort: false,
					allowRowDrop: true,
					showPager: false,
					showSeq: false,
					dataCopy: true,
					customSetting: false,
					colsort: false,
					storageOp: {innerStatus: false},
					_defaultData: {}
				}, gridOp), columns = gridDefaultOp.columns,
				defaultData = gridDefaultOp._defaultData;
			// 若配置列不存在时，赋默认值
			if (!columns) {
				columns = gridDefaultOp.columns  = [];
			}
			// 转换设置参数
			if (columns.length > 0) {
				// 简单数组
				if (columns.length == 1 && !columns[0].field) {
					var col = columns[0];
					// 若没有field属性，说明是简单数组，给item赋默认值
					col.field = "value";
					!col.header && (col.header = col.field);
					!col.width && (col.width = 100);
					// 赋默认值
					if (col.defaultValue != null) {
						defaultData.value = col.defaultValue;
						delete col.defaultValue;
					} else {
						defaultData.value = null;
					}
					// 标示该数组是简单数组
					gridDefaultOp._isSimpleArray = true;
				} else {
					var helper = Ccay.DataHelper, value, text;
					// 遍历项设置
					$.each(columns, function (i, col) {
						// 设置field新增数据的默认值
						text = helper.getObj(col.field, col.defaultValue);
						helper.setObj(col.field,defaultData, (text != null) ? text : null);
						// 设置valueField新增数据的默认值
						if (col.valueField) {
							value = helper.getObj(col.valueField, col.defaultValue);
						 	helper.setObj(col.valueField, defaultData, (value != null) ? value : null);
						}
						(col.defaultValue != null) && delete col.defaultValue;
					});
				}
			} else {
				// 未设置columns属性，则是简单数组，赋默认值
				defaultData.value = null;
				columns.push({field: "value", header: "value", width: 100});
				// 标示该数组是简单数组
				gridDefaultOp._isSimpleArray = true;
			}
			// 添加操作列
			columns.splice(0, 0, {
				columnType: 'operate', 
				width: 40, 
				freezeable: true, 
				btns: [{
					type: 'img', 
					imgtype:'del',
					text: "ccay.workflow.label.delete", 
					isIi8n: true,
					click: function (data, gridMag) {
						if (gridMag.valid()) {
							gridMag.op.Storage.destroyItem(data._index);
							gridMag.reload();
						}
					} 
				}]
			}, {
				inner: true, 
				width: 50, 
				freezeable: true,
    			_ctype: "Seq", 
    			headCss: 'grid-seq', 
    			header: 'ccay.common.message.pri', 
    			cssName: 'grid-seq', 
    			content: '<span>${# data._seq || index}</span>'
    		});
			return gridDefaultOp;
		}
	};
	
	Editor.add('arrayEditor', {
		build: function (container, op) {
			var ctr = $.create("div", 'ccay-editor-array', op && op.id).appendTo(container),
				toolPanel = $.create("div").appendTo(ctr),
				gridPanel= $.create("div", "control-composite").appendTo(ctr),
				gridOp = arrayEditor.setGridOp(op);
			// 设置工具栏
			toolPanel.ccayToolbar(arrayEditor.setToolOp(gridOp._defaultData));
			// 设置数组表格
			gridPanel.igrid(gridOp);
			// 标示数组是简单数组
			gridOp._isSimpleArray && ctr.data("simpleArray", true);
			return ctr;
		},
		getValue : function(ctr) {
			// 获取grid表格的值
			var dataArray = ctr.children(".ccay-igrid").manager().getValue(), tempArray = [];
			// 若是简单数组，则将值进行转换
			if (ctr.data("simpleArray")) {
				$.each(dataArray, function (i, data) {
					tempArray.push(data.value);
				});
				dataArray = tempArray;
			}
			return dataArray;
		},
		setValue : function(ctr, dataArray) {
			if (dataArray) {
				// 判断数组是否是简单数组，若是简单数组，则将数组进行转换
				if (ctr.data("simpleArray")) {
					var tempArray = [];
					$.each(dataArray, function (i, data) {
						tempArray.push({value: data});
					});
					dataArray = tempArray;
				}
				// 设置grid表格的值
				ctr.children(".ccay-igrid").manager().setValue(dataArray);
			}
		}
	});
	
	Editor.add('money', {
		build: function (container, op) {
			var ctr = $.create("input", "ccay-money", op && op.id || $.newGuid("grid_editor_"), "text").appendTo(container);
			ctr.ccayMoney(op);
			return ctr;
		},
		getValue : function(ctr) {
			var datas = ctr.manager("XMoney").getValue();
			var ctrOp = ctr.data("XMoney_op");
			return {
					text : ctr.val(),
					value : datas
				}
		},
		setValue : function(ctr, datas) {
			var ctrOp = ctr.data("XMoney_op");
			datas = datas || {};
			ctr.manager("XMoney").setValue(Ccay.DataHelper.getObj(ctrOp.amountName,datas),Ccay.DataHelper.getObj(ctrOp.currencyCodeName,datas),Ccay.DataHelper.getObj(ctrOp.exchangeDateName,datas));
			ctr.manager().setValue(Ccay.DataHelper.getObj(ctrOp.amountName,datas));
		}
	});
})(Ccay.Editor);
